package com.secsys.dao;

import java.io.Serializable;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

/**
 * @Description:公共接口
 * @author LiusQ 
 * @date 2011-3-27 23:37
 * @param <T>
 *            領域對象
 * @param <PK>
 *            主鍵模型
 */

public interface HibernateBaseDAO<T, PK extends Serializable> {

	// --------------基本增删改查操作------------------//

	/**
	 * 根据主键获取实体，如果没有则返回null值
	 */
	public T get(PK id);

	/**
	 * 根据主键获取实体，如果没有则抛出异常
	 */
	public T load(PK id);

	/**
	 * 获取所有实体
	 */
	public List<T> loadAll();

	/**
	 * 根据对象获取所有实体
	 * @param cass对象
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public List<?> loadAll(Class cass);

	/**
	 *  更新实体
	 * @param entity
	 */
	public void update(T entity);

	/**
	 *  存储实体到数据库
	 * @param entity
	 */
	public void save(T entity);

	/**
	 *  增加或更新实体
	 * @param entity
	 */
	public void saveOrUpdate(T entity);

	/**
	 *  增加或更新对象
	 * @param obj
	 */
	public void saveObjectReturn(Object obj);

	/**
	 *  增加或更新集合中的全部实体
	 * @param entities
	 */
	public void saveOrUpdateAll(Collection<T> entities);

	/**
	 *  删除实体
	 * @param entity
	 */
	public void delete(T entity);

	/**
	 *  根据主键删除实体
	 * @param id
	 */
	public void deleteByKey(PK id);

	/**
	 *  删除集合中的所有实体
	 * @param entities实体集合
	 */
	public void deleteAll(Collection<T> entities);

	/**
	 *  根据id删除对象，id用于获取所在对象的实体类对象
	 * @param clazz
	 * @param id
	 */
	@SuppressWarnings("unchecked")
	public void removeObject(Class clazz, Serializable id);

	@SuppressWarnings("unchecked")
	public Object getObject(Class clazz, Serializable id);

	// -------------HQL----------------------//

	/**
	 *  使用HSQL语句直接增加、更新、删除实体
	 */
	public int bulkUpdate(String queryString);

	/**
	 *  使用带参数的HSQL语句增加、更新、删除实体
	 * @param queryString带参数的HSQL语句
	 * @param values参数值数组
	 * @return
	 */
	public int bulkUpdate(String queryString, Object[] values);

	/**
	 *  使用HSQL语句检索数据
	 * @param queryString
	 * @return
	 */
	public List<T> find(String queryString);
	
	/**
	 * 返回多表查询的Object类型的List数据
	 * @author 	tiger.hu
	 * @param 	queryString
	 * 				不带参数的多表查询的HSQL语句
	 * @return 	List<Object[]>
	 * 				返回多表查询结果的“多个对象数组”的List，也就是List<Object[]>
	 */
	public List<Object> findObject(String queryString);
	
	/**
	 * 返回分页多表查询的Object类型的List数据
	 * @author 	tiger.hu
	 * @param 	queryString
	 * 				不带参数的多表查询的HSQL语句
	 * @param 	offset 
	 * 			-分页的起始索引
	 * @param 	size
	 * 			-显示条数
	 * 				
	 * @return 	List<Object[]>
	 * 				返回多表查询结果的“多个对象数组”的List，也就是List<Object[]>
	 */
	public List<Object> findObject(String queryString,int offset,int count);

	/**
	 *  使用带参数的HSQL语句检索数据
	 * @param queryString带参数的HSQL语句
	 * @param values参数值数组
	 * @return
	 */
	public List<T> find(String queryString, Object[] values);
	
	/**
	 * 使用带参数的多表查询的Object类型的List数据
	 * @author 	tiger.hu
	 * @param 	queryString
	 * 				带参数的多表查询的HSQL语句
	 * @param 	values
	 * 				参数值数组
	 * @return 	List<Object[]>
	 * 				返回多表查询结果的“多个对象数组”的List，也就是List<Object[]>
	 */
	public List<Object> findObject(String queryString, Object[] values);
	
	/**
	 * 使用带参数的分页多表查询的Object类型的List数据
	 * @param 	queryString
	 * 				带参数的多表查询的HSQL语句
	 * @param 	values
	 * 				参数值数组
	 * @param offset 
	 * 			-分页的起始索引
	 * @param size
	 * 			-显示条数
	 * 				
	 * @return 	List<Object[]>
	 * 				返回多表查询结果的“多个对象数组”的List，也就是List<Object[]>
	 */
	public List<Object> findObject(String queryString, Object[] values,int offset,int count);

	/**
	 *  使用带属性参数的HQL语句检索数据
	 * @param queryString
	 * 			-带属性参数的HQL语句
	 * @param value
	 * 			-属性参数值
	 * @return
	 */
	public List<T> findByProperty(String queryString, Object value);

	/**
	 *  使用带命名的参数的HSQL语句检索数据
	 * @param queryString
	 * @param paramNames
	 * @param values
	 * @return
	 */
	public List<T> findByNamedParam(String queryString, String[] paramNames,Object[] values);

	/**
	 *  使用命名的HSQL语句检索数据
	 * @param queryName
	 * @return
	 */
	public List<T> findByNamedQuery(String queryName);

	/**
	 *  使用带参数的命名HSQL语句检索数据
	 * @param queryName查询语句
	 * @param values参数值数组
	 * @return
	 */
	public List<T> findByNamedQuery(String queryName, Object[] values);

	/**
	 *  使用带命名参数的命名HSQL语句检索数据
	 * @param queryName
	 * @param paramNames
	 * @param values
	 * @return
	 */
	public List<T> findByNamedQueryAndNamedParam(String queryName,
			String[] paramNames, Object[] values);

	/**
	 *  使用HSQL语句检索数据，返回 Iterator
	 * @param queryString
	 * @return
	 */
	public Iterator<T> iterate(String queryString);
	
	/**
	 * 使用带参数HSQL语句检索数据，返回 Iterator
	 * @param queryString
	 * @param values
	 * @return
	 */
	public Iterator<T> iterate(String queryString, Object[] values);

	/**
	 *  关闭检索返回的 Iterator
	 * @param it
	 */
	public void closeIterator(Iterator<T> it);

	/**
	 *  使用HQL语句检索满足标准的记录数
	 * @param hql
	 * @return
	 */
	public Integer findCount(String hql);
	
	// --------------------- SQL --------------------------

	/**
	 *  使用带参数的SQL语句检索数据
	 */
	public List<T> findBySql(String sql, Class<?> clazz, Object[] values,
			Object[][] obj);

	/**
	 *  分页查询
	 * @param queryString
	 * @param offset
	 * @param size
	 * @return
	 */
	public List<T> findBySql(String queryString, int offset, int size);

	/**
	 *  分页查询
	 * @param queryString
	 * @param offset
	 * @param size
	 * @param map
	 * @return
	 */
	public List<T> findBySql(String queryString, int offset, int size,
			Map<String, Date> map);
	
	/**
	 * 利用带参数的hql语句分页查询
	 * @param queryString
	 * @param objects
	 * 			-参数值数组
	 * @param offset 
	 * 			-分页的起始索引
	 * @param size
	 * 			-显示条数
	 * @return List<T>
	 */
	public List<T> findBySql(String queryString,Object[] objects, int offset, int size);

	/**
	 *  使用带参数的SQL语句检索数据(指定记录数)
	 * @param sql
	 * @param clazz
	 * @param values
	 * @param obj
	 * @param offset
	 * @param size
	 * @return
	 */
	public List<T> findBySql(String sql, Class<?> clazz, Object[] values,
			Object[][] obj, int offset, int size);

	// --------------------其他----------------//
	/**
	 *  强制初始化指定的实体
	 */
	public void initialize(Object proxy);

	/**
	 *  强制立即更新缓冲数据到数据库（否则仅在事务提交时才更新）
	 */
	public void flush();

	public void clear();

	public Integer count();

	public Integer count(String hql);

	public Integer count(final String hql, final Map<String, Date> map);
   public void merge(T entity);
   
   public List getCount(String sql);  //通过sql语句进行统计
   
}
